package com.langxin.erp.action.upload;

import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Random;

import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.multipart.commons.CommonsMultipartFile;

import com.langxin.erp.util.constant.SiteConstant;
import com.langxin.erp.util.web.JsonUtils;

/**
 * KindEditor上传文件
 * @author gu
 *
 */
@Controller
public class KindEditorUploadAction {

	
	@RequestMapping(value="/kingEditor/upload",method={RequestMethod.POST, RequestMethod.GET})
	@ResponseBody
	public String upload(MultipartHttpServletRequest request) throws FileUploadException{
		
		//文件保存目录路径
		String savePath = SiteConstant.UPLOAD_FILE_PATH + "/attached/";

		//文件保存目录URL
		String saveUrl  = SiteConstant.UPLOAD_FILE_URL + "attached/";

		//定义允许上传的文件扩展名
	    Map<String, String> extMap = new HashMap<String, String>();
		extMap.put("image", "gif,jpg,jpeg,png,bmp");
		extMap.put("flash", "swf,flv");
		extMap.put("media", "swf,flv,mp3,wav,wma,wmv,mid,avi,mpg,asf,rm,rmvb");
		extMap.put("file", "doc,docx,xls,xlsx,ppt,htm,html,txt,zip,rar,gz,bz2");

		//最大文件大小
		long maxSize = 1000000;

		if(!ServletFileUpload.isMultipartContent(request)){
			return getError("请选择文件！");
		}
		//检查目录
		File uploadDir = new File(savePath);
		if(!uploadDir.exists()){
			uploadDir.mkdir();
		}
		//检查目录写权限
		if(!uploadDir.canWrite()){
			return getError("上传目录没有写权限！");
		}

		String dirName = request.getParameter("dir");
		if (dirName == null) {
			dirName = "image";
		}
		if(!extMap.containsKey(dirName)){
			return getError("目录名不正确！");
		}
		//创建文件夹
		savePath += dirName + "/";
		saveUrl += dirName + "/";
		File saveDirFile = new File(savePath);
		if (!saveDirFile.exists()) {
			saveDirFile.mkdirs();
		}
		SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
		String ymd = sdf.format(new Date());
		savePath += ymd + "/";
		saveUrl += ymd + "/";
		File dirFile = new File(savePath);
		if (!dirFile.exists()) {
			dirFile.mkdirs();
		}

		FileItemFactory factory = new DiskFileItemFactory();
		ServletFileUpload upload = new ServletFileUpload(factory);
		upload.setHeaderEncoding("UTF-8");
		List items = upload.parseRequest(request);
		Map mapFile = request.getFileMap();
		Collection<MultipartFile> c = mapFile.values();
		Iterator itr = c.iterator();
		while (itr.hasNext()) {
			CommonsMultipartFile file=(CommonsMultipartFile) itr.next();
			String fileName = file.getOriginalFilename();
			if (!file.isEmpty()) {
				//检查文件大小
				if(file.getSize() > maxSize){
					return getError("上传文件大小超过限制！");
				}
				//检查扩展名
				String fileExt = fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase();
				if(!Arrays.<String>asList(extMap.get(dirName).split(",")).contains(fileExt)){
					return getError("上传文件扩展名是不允许的扩展名。\n只允许" + extMap.get(dirName) + "格式！");
				}

				SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");
				String newFileName = df.format(new Date()) + "_" + new Random().nextInt(1000) + "." + fileExt;
				try{
					File uploadedFile = new File(savePath, newFileName);
					file.transferTo(uploadedFile);
				}catch(Exception e){
					return getError("上传文件失败！");
				}
                return getError(0, saveUrl + newFileName, "url");
			}
		}
		return getError("上传文件失败！");
	}
	
	private String getError(String message){
		return getError(null, message, null);
	}
	
	private String getError(Integer result, String message, String msg) {
		Map<String, Object> map = new HashMap<String, Object>();
		map.put("error", result == null ? 1 : result);
		map.put(msg==null?"message" : msg, message);
		return JsonUtils.toJson(map);
	}
}
